<?php
namespace app\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;
use think\facade\Log;

class Chanpin extends BaseController
{
    /**
     * 成功返回
     */
    protected function success($msg = '', $data = null)
    {
        return json([
            'code' => 200,
            'msg' => $msg,
            'data' => $data
        ]);
    }

    /**
     * 失败返回
     */
    protected function error($msg = '', $data = null)
    {
        return json([
            'code' => 400,
            'msg' => $msg,
            'data' => $data
        ]);
    }

    /**
     * 获取产品列表
     */
    public function getList()
    {
        $page = input('page/d', 1);
        $pageSize = input('pageSize/d', 20);
        $keyword = input('keyword/s', '');
        
        // 记录请求参数
        Log::info('产品列表请求参数: ' . json_encode([
            'page' => $page,
            'pageSize' => $pageSize,
            'keyword' => $keyword
        ]));
        
        $where = [];
        if (!empty($keyword)) {
            $where[] = ['product_name|product_code', 'like', "%{$keyword}%"];
        }
        
        try {
            $count = Db::name('product')
                ->where($where)
                ->count();
                
            $list = Db::name('product')
                ->where($where)
                ->page($page, $pageSize)
                ->order('id', 'desc')
                ->select()
                ->toArray();
                
            Log::info('产品列表查询结果: 总数=' . $count . ', 列表数=' . count($list));
            
            return $this->success('获取成功', [
                    'list' => $list,
                    'total' => $count
            ]);
        } catch (\Exception $e) {
            Log::error('产品列表查询异常: ' . $e->getMessage());
            return $this->error('查询异常: ' . $e->getMessage(), [
                    'list' => [],
                    'total' => 0
            ]);
        }
    }
    
    /**
     * 添加或编辑产品
     */
    public function doEdit()
    {
        $data = Request::post();
        Log::info('添加/编辑产品请求数据: ' . json_encode($data));
        
        // 验证必填字段
        if (empty($data['product_name'])) {
            return $this->error('产品名称不能为空');
        }
        if (empty($data['product_code'])) {
            return $this->error('产品编号不能为空');
        }
        
        // 处理数据
        $saveData = [
            'product_name' => $data['product_name'],
            'product_code' => $data['product_code']
        ];
        
        try {
            // 新增或更新
            if (isset($data['id']) && $data['id'] > 0) {
                // 检查编号是否重复
                $exists = Db::name('product')
                    ->where('product_code', $data['product_code'])
                    ->where('id', '<>', $data['id'])
                    ->find();
                    
                if ($exists) {
                    return $this->error('产品编号已存在');
                }
                
                // 更新
                Db::name('product')
                    ->where('id', $data['id'])
                    ->update($saveData);
                $msg = '更新成功';
            } else {
                // 检查编号是否重复
                $exists = Db::name('product')
                    ->where('product_code', $data['product_code'])
                    ->find();
                    
                if ($exists) {
                    return $this->error('产品编号已存在');
                }
                
                // 添加创建时间
                $saveData['create_time'] = date('Y-m-d H:i:s');
                
                // 新增
                $id = Db::name('product')->insertGetId($saveData);
                $msg = '添加成功';
                $data['id'] = $id;
            }
            
            return $this->success($msg, $data);
        } catch (\Exception $e) {
            Log::error('添加/编辑产品异常: ' . $e->getMessage());
            return $this->error('操作失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 删除产品
     */
    public function doDelete()
    {
        $ids = Request::post('ids');
        Log::info('删除产品请求: ids=' . $ids);
        
        if (empty($ids)) {
            return $this->error('请选择要删除的记录');
        }
        
        try {
            $idArr = explode(',', $ids);
            
            // 检查是否有关联的BOM清单
            $hasBom = Db::name('product_bom')
                ->whereIn('product_id', $idArr)
                ->find();
                
            if ($hasBom) {
                return $this->error('选中的产品已关联BOM清单，请先删除关联的BOM清单');
            }
            
            // 删除产品
            Db::name('product')->whereIn('id', $idArr)->delete();
            
            return $this->success('删除成功');
        } catch (\Exception $e) {
            Log::error('删除产品异常: ' . $e->getMessage());
            return $this->error('删除失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 生成随机产品编号
     */
    public function generateCode()
    {
        try {
            $code = $this->generateRandomCode();
            
            // 检查是否已存在
            $exists = Db::name('product')->where('product_code', $code)->find();
            
            // 如果存在，重新生成直到不重复
            $maxTries = 10;
            $currentTry = 0;
            
            while ($exists && $currentTry < $maxTries) {
                $code = $this->generateRandomCode();
                $exists = Db::name('product')->where('product_code', $code)->find();
                $currentTry++;
            }
            
            if ($exists) {
                return $this->error('无法生成唯一编号，请稍后再试');
            }
            
            return $this->success('生成成功', ['code' => $code]);
        } catch (\Exception $e) {
            Log::error('生成产品编号异常: ' . $e->getMessage());
            return $this->error('生成编号失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 生成随机编码：3位大写字母+3位数字
     */
    private function generateRandomCode()
    {
        $letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $numbers = '0123456789';
        
        $code = '';
        
        // 生成3位大写字母
        for ($i = 0; $i < 3; $i++) {
            $code .= $letters[rand(0, strlen($letters) - 1)];
        }
        
        // 生成3位数字
        for ($i = 0; $i < 3; $i++) {
            $code .= $numbers[rand(0, strlen($numbers) - 1)];
        }
        
        return $code;
    }
    
    /**
     * 获取产品BOM清单
     */
    public function getBomList()
    {
        $productId = input('product_id/d', 0);
        $page = input('page/d', 1);
        $pageSize = input('pageSize/d', 20);
        
        if (empty($productId)) {
            return $this->error('请选择产品');
        }
        
        try {
            // 查询产品是否存在
            $product = Db::name('product')->where('id', $productId)->find();
            
            if (!$product) {
                return $this->error('产品不存在');
            }
            
            // 查询BOM清单，关联物料表获取物料名称和编码
            $list = Db::name('product_bom')
                ->alias('pb')
                ->join('material_category mc', 'pb.material_id = mc.id', 'left')
                ->field('pb.*, mc.material_name, mc.material_code, mc.current_quantity as stock_quantity')
                ->where('pb.product_id', $productId)
                ->page($page, $pageSize)
                ->order('pb.id', 'asc')
                ->select()
                ->toArray();
                
            $count = Db::name('product_bom')
                ->where('product_id', $productId)
                ->count();
                
            return $this->success('获取成功', $list);
        } catch (\Exception $e) {
            Log::error('获取产品BOM清单异常: ' . $e->getMessage());
            return $this->error('获取BOM清单失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 添加或编辑BOM清单项
     */
    public function doEditBom()
    {
        $data = Request::post();
        Log::info('添加/编辑BOM清单请求数据: ' . json_encode($data));
        
        // 验证必填字段
        if (empty($data['product_id'])) {
            return $this->error('产品ID不能为空');
        }
        if (empty($data['material_id'])) {
            return $this->error('物料ID不能为空');
        }
        
        // 处理数量，确保是整数且不小于1
        $quantity = isset($data['quantity']) ? intval($data['quantity']) : 1;
        if ($quantity < 1) {
            $quantity = 1;
        }
        
        // 处理数据
        $saveData = [
            'product_id' => $data['product_id'],
            'material_id' => $data['material_id'],
            'quantity' => $quantity
        ];
        
        try {
            // 获取物料信息
            $material = Db::name('material_category')
                ->where('id', $data['material_id'])
                ->find();
                
            if (!$material) {
                return $this->error('物料不存在');
            }
            
            // 获取产品信息
            $product = Db::name('product')
                ->where('id', $data['product_id'])
                ->find();
                
            if (!$product) {
                return $this->error('产品不存在');
            }
            
            // 新增或更新
            if (isset($data['id']) && $data['id'] > 0) {
                // 检查是否重复
                $exists = Db::name('product_bom')
                    ->where('product_id', $data['product_id'])
                    ->where('material_id', $data['material_id'])
                    ->where('id', '<>', $data['id'])
                    ->find();
                    
                if ($exists) {
                    return $this->error('该产品已关联此物料');
                }
                
                // 更新
                Db::name('product_bom')
                    ->where('id', $data['id'])
                    ->update($saveData);
                $msg = '更新成功';
            } else {
                // 检查是否重复
                $exists = Db::name('product_bom')
                    ->where('product_id', $data['product_id'])
                    ->where('material_id', $data['material_id'])
                    ->find();
                    
            if ($exists) {
                    return $this->error('该产品已关联此物料');
            }
            
                // 新增
                $id = Db::name('product_bom')->insertGetId($saveData);
                $msg = '添加成功';
                $data['id'] = $id;
            }
            
            // 返回完整数据
            $data['material_name'] = $material['material_name'];
            $data['material_code'] = $material['material_code'];
            $data['product_name'] = $product['product_name'];
            $data['product_code'] = $product['product_code'];
            $data['quantity'] = $quantity;
            
            return $this->success($msg, $data);
        } catch (\Exception $e) {
            Log::error('添加/编辑BOM清单异常: ' . $e->getMessage());
            return $this->error('操作失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 删除BOM清单项
     */
    public function doDeleteBom()
    {
        $ids = Request::post('ids');
        Log::info('删除BOM清单请求: ids=' . $ids);
        
        if (empty($ids)) {
            return $this->error('请选择要删除的记录');
        }
        
        try {
            $idArr = explode(',', $ids);
            Db::name('product_bom')->whereIn('id', $idArr)->delete();
            
            return $this->success('删除成功');
        } catch (\Exception $e) {
            Log::error('删除BOM清单异常: ' . $e->getMessage());
            return $this->error('删除失败: ' . $e->getMessage());
        }
            }
            
    /**
     * 获取物料列表（用于下拉选择）
     */
    public function getMaterialList()
    {
        $keyword = input('keyword/s', '');
        $id = input('id/d', 0);
        
        try {
            $where = [];
            if (!empty($keyword)) {
                $where[] = ['material_name|material_code', 'like', "%{$keyword}%"];
            }
            
            if (!empty($id)) {
                $where[] = ['id', '=', $id];
                }
            
            $list = Db::name('material_category')
                ->where($where)
                ->field('id, material_name, material_code')
                ->limit(20) // 限制返回数量
                ->select()
                ->toArray();
            
            return $this->success('获取成功', $list);
        } catch (\Exception $e) {
            Log::error('获取物料列表异常: ' . $e->getMessage());
            return $this->error('获取失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 获取产品列表（用于下拉选择）
     */
    public function getProductSelect()
    {
        $keyword = input('keyword/s', '');
        $id = input('id/d', 0);
        
        try {
            $where = [];
            if (!empty($keyword)) {
                $where[] = ['product_name|product_code', 'like', "%{$keyword}%"];
            }
            
            if (!empty($id)) {
                $where[] = ['id', '=', $id];
            }
            
            $list = Db::name('product')
                ->where($where)
                ->field('id, product_name, product_code')
                ->limit(20) // 限制返回数量
                ->select()
                ->toArray();
                
            return $this->success('获取成功', $list);
        } catch (\Exception $e) {
            Log::error('获取产品下拉列表异常: ' . $e->getMessage());
            return $this->error('获取失败: ' . $e->getMessage());
        }
    }
}